#include <gtest/gtest.h>
#include "storage/page.h"

// 测试PageHeader的overflow方法
TEST(PageHeaderTest, IsOverflow) {
    boltDB::Page page;
    boltDB::Page::PageHeader header(page.GetData());

    // 设置页头数据，模拟没有溢出的情况
    uint32_t no_overflow = 0xFFFFFFFF;
    std::memcpy(page.GetData() + 4, &no_overflow, sizeof(no_overflow));
    EXPECT_EQ(header.IsOverflow(), std::nullopt);

    // 设置页头数据，模拟有溢出的情况
    uint32_t overflow_page_id = 12345;
    std::memcpy(page.GetData() + 4, &overflow_page_id, sizeof(overflow_page_id));
    EXPECT_EQ(header.IsOverflow(), overflow_page_id);
}

// 测试PageHeader的type方法
TEST(PageHeaderTest, Type) {
    boltDB::Page page;
    boltDB::Page::PageHeader header(page.GetData());

    // 设置页头数据，模拟LeafPage类型
    boltDB::PageType leaf_page_type = boltDB::PageType::LeafPage;
    std::memcpy(page.GetData() + 8, &leaf_page_type, sizeof(leaf_page_type));
    EXPECT_EQ(*header.Type(), boltDB::PageType::LeafPage);

    // 设置页头数据，模拟BranchPage类型
    boltDB::PageType branch_page_type = boltDB::PageType::BranchPage;
    std::memcpy(page.GetData() + 8, &branch_page_type, sizeof(branch_page_type));
    EXPECT_EQ(*header.Type(), boltDB::PageType::BranchPage);
}

// 测试PageHeader的count方法
TEST(PageHeaderTest, Count) {
    boltDB::Page page;
    boltDB::Page::PageHeader header(page.GetData());

    // 设置页头数据，模拟包含5个元素
    uint16_t count = 5;
    std::memcpy(page.GetData() + 10, &count, sizeof(count));
    EXPECT_EQ(header.Count(), 5);

    // 设置页头数据，模拟包含0个元素
    count = 0;
    std::memcpy(page.GetData() + 10, &count, sizeof(count));
    EXPECT_EQ(header.Count(), 0);
}